// @/utils/request.js
import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '@/stores/user'
import router from '@/router'

// 创建axios实例
const service = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL || '',  // 使用相对路径，让Vite代理处理
    timeout: 30000,
    headers: {
        'Content-Type': 'application/json;charset=UTF-8'
    }
})

// 是否正在刷新token
let isRefreshing = false
// 重试队列
let failedQueue = []

// 处理队列
const processQueue = (error, token = null) => {
    failedQueue.forEach(({ resolve, reject }) => {
        if (error) {
            reject(error)
        } else {
            resolve(token)
        }
    })

    failedQueue = []
}

// 请求拦截器
service.interceptors.request.use(
    config => {
        const userStore = useUserStore()



        // 如果有token，添加到请求头（store 优先，兜底 localStorage）
        const token = userStore.token || localStorage.getItem('token')
        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }

        // 如果是FormData，让浏览器自动设置Content-Type（包含boundary）
        if (config.data instanceof FormData) {
            delete config.headers['Content-Type']
        }

        // 添加时间戳，防止缓存
        if (config.method === 'get') {
            config.params = {
                _t: Date.now(),
                ...config.params
            }
        }



        return config
    },
    error => {
        console.error('Request error:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
        const res = response.data

        // 如果是文件下载，直接返回
        if (response.config.responseType === 'blob') {
            return response
        }

        // 如果后端返回的是字符串（如"申报成功，项目ID: 123"），直接返回
        if (typeof res === 'string') {
            return res
        }

        // 这里根据后端的响应格式进行调整
        // 假设后端返回格式为: { code: 200, data: {}, message: '' }
        if (res.code !== undefined && res.code !== 200) {
            ElMessage.error(res.message || '请求失败')

            // 401: 未授权，处理token过期或无效的情况
            if (res.code === 401) {
                return handleUnauthorized(response.config)
            }

            return Promise.reject(new Error(res.message || '请求失败'))
        }

        return res
    },
    error => {
        console.error('Response error:', error)

        let message = '网络错误'

        if (error.response) {
            const { status, data } = error.response

            switch (status) {
                case 400:
                    message = data.message || data || '请求参数错误'
                    break
	                case 401:
					// 登录接口的401：提示用户名或密码错误
					if (error.config && error.config.url && String(error.config.url).includes('/auth/login')) {
						message = (data && (data.message || data)) || '用户名或密码错误'
						break
					}
					// 修改密码接口：旧密码错误等业务错误，不跳转登录，直接提示
					if (error.config && error.config.url && String(error.config.url).includes('/user/change_password')) {
						message = '当前密码不正确'
						break
					}
					// 奖项接口：把401当业务错误提示，不跳登录（常见为权限校验）
					if (error.config && error.config.url && String(error.config.url).includes('/awards')) {
						message = (data && (data.message || data)) || '无权操作或登录已过期'
						ElMessage.error(message)
						return Promise.reject(error)
					}
					// 项目相关接口：把401当业务错误提示，不跳登录（常见为权限校验）
					if (error.config && error.config.url && (String(error.config.url).includes('/projects') || String(error.config.url).includes('/research-projects'))) {
						message = (data && (data.message || data)) || '无权操作或登录已过期'
						ElMessage.error(message)
						return Promise.reject(error)
					}
                    // 讲座接口：把401当业务错误提示，不跳登录（常见为权限校验）
                    if (error.config && error.config.url && String(error.config.url).includes('/lectures')) {
                        message = (data && (data.message || data)) || '无权操作或登录已过期'
                        ElMessage.error(message)
                        return Promise.reject(error)
                    }
					// 学术成果接口：把401当业务错误提示，不跳登录（常见为权限校验）
					if (error.config && error.config.url && String(error.config.url).includes('/academic-achievements')) {
						message = (data && (data.message || data)) || '无权操作或登录已过期'
						ElMessage.error(message)
						return Promise.reject(error)
					}
					// 统一处理：登录状态失效，直接跳转登录（不再重复弹业务错误提示，避免双提示）
					redirectToLogin()
					return Promise.reject(error)
                case 403:
                    message = data.message || data || '拒绝访问'
                    break
                case 404:
                    message = data.message || data || '请求地址不存在'
                    break
                case 413:
                    message = '上传文件过大'
                    break
                case 422:
                    message = data.message || data || '数据验证失败'
                    break
                case 500:
                    // 如果返回的是字符串，直接使用（可能是后端RuntimeException的消息）
                    if (typeof data === 'string') {
                        message = data
                    } else {
                        message = data.message || '服务器内部错误'
                    }
                    break
                default:
                    message = data.message || data || `连接错误${status}`
            }
        } else if (error.code === 'ECONNABORTED') {
            message = '请求超时'
        } else if (error.message.includes('Network Error')) {
            message = '网络连接异常'
        }

        ElMessage.error(message)
        return Promise.reject(error)
    }
)

// 处理401未授权错误（简化版：无刷新token机制，直接跳登录）
const handleUnauthorized = async (config) => {
    // 对 awards 接口单独兜底：如果命中了这里，仍然只提示，不跳转
    if (config && config.url && String(config.url).includes('/awards')) {
        ElMessage.error('无权操作或登录已过期')
        return Promise.reject(new Error('未授权'))
    }
    // 对项目相关接口单独兜底：如果命中了这里，仍然只提示，不跳转
    if (config && config.url && (String(config.url).includes('/projects') || String(config.url).includes('/research-projects'))) {
        ElMessage.error('无权操作或登录已过期')
        return Promise.reject(new Error('未授权'))
    }
    // 对讲座接口单独兜底
    if (config && config.url && String(config.url).includes('/lectures')) {
        ElMessage.error('无权操作或登录已过期')
        return Promise.reject(new Error('未授权'))
    }
    // 对学术成果接口单独兜底：如果命中了这里，仍然只提示，不跳转
    if (config && config.url && String(config.url).includes('/academic-achievements')) {
        ElMessage.error('无权操作或登录已过期')
        return Promise.reject(new Error('未授权'))
    }
    redirectToLogin()
    return Promise.reject(new Error('未授权'))
}

// 跳转到登录页
const redirectToLogin = () => {
    const userStore = useUserStore()

    ElMessageBox.confirm(
        '登录状态已过期，请重新登录',
        '系统提示',
        {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
        }
    ).then(() => {
        userStore.logout()
        router.push('/login')
    }).catch(() => {})
}

export default service